// Text Editor Class.
// Usage: construct it with a <textarea> element reference.
// Based on functions from alexking.org
// Thank you Alex


function Para_TextEditor( console ) {
    this.console = console;

    // use mootools browser detection
    this.is_gecko  = window.gecko;
    this.is_safari = window.webkit;

    para_debug("is_gecko " + this.is_gecko );
    para_debug("is_safari " + this.is_safari );

    // methods
    this.insert_tags      = Para_TextEditor_insertTags;
    this.insert_at_carret = Para_TextEdit_insertAtCarret;
}


/*
 * Insert the given value at the current cursor position
 *
 * @see http://www.alexking.org/index.php?content=software/javascript/content.php
 */
function Para_TextEditor_insertTags(tagOpen, tagClose, sampleText) {
    var txtarea = this.console;
    // IE
    if(document.selection  && !this.is_gecko) {
        var theSelection = document.selection.createRange().text;
        var replaced = true;
        if(!theSelection){
            replaced = false;
            theSelection=sampleText;
        }
        txtarea.focus();

        // This has change
        var text = theSelection;
        if(theSelection.charAt(theSelection.length - 1) == " "){// exclude ending space char, if any
            theSelection = theSelection.substring(0, theSelection.length - 1);
            r = document.selection.createRange();
            r.text = tagOpen + theSelection + tagClose + " ";
        } 
        else {
            r = document.selection.createRange();
            r.text = tagOpen + theSelection + tagClose;
        }
        if(!replaced){
            r.moveStart('character',-text.length-tagClose.length);
            r.moveEnd('character',-tagClose.length);
        }
        r.select();

    } 

   // Mozilla
    else if(txtarea.selectionStart || txtarea.selectionStart == '0') {
        replaced = false;
        var startPos = txtarea.selectionStart;
        var endPos   = txtarea.selectionEnd;
        if(endPos - startPos){ replaced = true; }
        var scrollTop=txtarea.scrollTop;
        var myText = (txtarea.value).substring(startPos, endPos);
        if(!myText) { myText=sampleText;}
        if(myText.charAt(myText.length - 1) == " "){ // exclude ending space char, if any
            subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
        } else {
            subst = tagOpen + myText + tagClose;
        }
        txtarea.value = txtarea.value.substring(0, startPos) + subst +
            txtarea.value.substring(endPos, txtarea.value.length);
        txtarea.focus();

        //set new selection
        if(replaced){
            var cPos=startPos+(tagOpen.length+myText.length+tagClose.length);
            txtarea.selectionStart=cPos;
            txtarea.selectionEnd=cPos;
        } 
        else {
            txtarea.selectionStart=startPos+tagOpen.length;
            txtarea.selectionEnd=startPos+tagOpen.length+myText.length;
        }
        txtarea.scrollTop=scrollTop;
    } 

    // All others
    else {
        var copy_alertText=alertText;
        var re1=new RegExp("\\$1","g");
        var re2=new RegExp("\\$2","g");
        copy_alertText=copy_alertText.replace(re1,sampleText);
        copy_alertText=copy_alertText.replace(re2,tagOpen+sampleText+tagClose);

        if (sampleText) {
            text=prompt(copy_alertText);
        } else {
            text="";
        }
        if(!text) { text=sampleText;}
        text=tagOpen+text+tagClose;
        //append to the end
        txtarea.value += "\n"+text;

        // in Safari this causes scrolling
        if(!this.is_safari) {
            txtarea.focus();
        }

    }

    // reposition cursor if possible
    if (txtarea.createTextRange){
        txtarea.caretPos = document.selection.createRange().duplicate();
    }
}

/*
 * Insert the given value at the current cursor position
 *
 * @see http://www.alexking.org/index.php?content=software/javascript/content.php
 */
function Para_TextEdit_insertAtCarret( value){
    var field = this.console;

    //IE support
    if (document.selection) {
        field.focus();
        var sel = document.selection.createRange();
        sel.text = value;
    }

    //MOZILLA/NETSCAPE support
    else if (field.selectionStart || field.selectionStart == '0') {
        var startPos  = field.selectionStart;
        var endPos    = field.selectionEnd;
        var scrollTop = field.scrollTop;
        field.value = field.value.substring(0, startPos) +
                      value +
                      field.value.substring(endPos, field.value.length);

        field.focus();
        var cPos = startPos+(value.length);
        field.selectionStart = cPos;
        field.selectionEnd   = cPos;
        field.scrollTop      = scrollTop;
    }

    else {
        field.value += "\n" + value;
    }

    // reposition cursor if possible
    if (field.createTextRange){
        field.caretPos = document.selection.createRange().duplicate();
    }
}

